package com.ydd.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;

import com.ydd.dto.YddUserPageQueryDTO;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.ydd.dto.SysUserLoginDTO;
import com.ydd.dto.UserRegDTO;
import com.ydd.dto.YddUserLoginDTO;
import com.ydd.entity.Article;
import com.ydd.entity.SysUser;
import com.ydd.entity.UserData;
import com.ydd.entity.YddUser;
import com.ydd.exception.BaseException;
import com.ydd.mapper.ArticleMapper;
import com.ydd.mapper.UserDataMapper;
import com.ydd.mapper.YddUserMapper;
import com.ydd.result.PageResult;
import com.ydd.service.IYddUserService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ydd.vo.UserInfoVO;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;

import java.util.Collections;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author hgz
 * @since 2023-05-30
 */
@Service

public class YddUserServiceImpl extends ServiceImpl<YddUserMapper, YddUser> implements IYddUserService {

    @Autowired
    private YddUserMapper yddUserMapper;

    /**
     * 分页查询
     * @param yddUserPageQueryDTO
     * @return
     */
    public PageResult pageByCondition(YddUserPageQueryDTO yddUserPageQueryDTO){

        Page<YddUser> page = new Page<>(yddUserPageQueryDTO.getPage(),yddUserPageQueryDTO.getLimit());
        QueryWrapper<YddUser> wrapper = new QueryWrapper<>();


        wrapper.lambda().like(yddUserPageQueryDTO.getMobile()!=null,YddUser::getMobile,yddUserPageQueryDTO.getMobile());
        wrapper.lambda().like(yddUserPageQueryDTO.getUsername()!=null,YddUser::getUsername,yddUserPageQueryDTO.getUsername());
        wrapper.lambda().like(yddUserPageQueryDTO.getSex()!=null,YddUser::getSex,yddUserPageQueryDTO.getSex());
        yddUserMapper.selectPage(page,wrapper);


        PageResult pageResult = PageResult.builder()
                .count((int) page.getTotal())
                .pageSize((int) page.getSize())
                .totalPage((int)page.getTotal())
                .currentPage((int)page.getCurrent())
                .data(page.getRecords())
                .build();

        return pageResult;
    }

    /**
     * 修改用户信息
     *
     * @param yddUser
     * @param userId
     */
    @Override
    public void updateUserInfo(YddUser yddUser, Integer userId) {

        QueryWrapper<YddUser> wrapper = new QueryWrapper<>();

        wrapper.lambda().eq(userId!=null,YddUser::getId,userId);

        yddUserMapper.update(yddUser,wrapper);

    }

    /**
     * 用户注册
     * @param userRegDTO
     * @return
     */
    @Override
    public Integer reg(UserRegDTO userRegDTO) {
        YddUser user = yddUserMapper.selectByMobile(userRegDTO.getMobile());
        if (user != null){
            throw new RuntimeException("手机号已注册");
        }
        YddUser yddUser = new YddUser();
        BeanUtils.copyProperties(userRegDTO, yddUser);
        yddUser.setPassword(DigestUtils.md5DigestAsHex((yddUser.getPassword()).getBytes()));
        yddUserMapper.add(yddUser);
        return yddUser.getId();
    }

    @Override
    public YddUser login(YddUserLoginDTO yddUserLoginDTO) {
        String mobile = yddUserLoginDTO.getMobile();
        String password = yddUserLoginDTO.getPassword();

        //根据用户名查询数据库中的数据
        YddUser yddUser = yddUserMapper.findByMobile(mobile);

        //处理各种异常情况（用户名不存在、密码不对、账号被锁定）
        if (yddUser == null) {
            //账号不存在
            throw new BaseException("手机号未注册");
        }

        //密码比对
        // TODO 后期需要进行md5加密，然后再进行比对
        //使用spring框架提供的api: DigestUtils.md5DigestAsHex(字节数组) 获取md5加盐加密的密文
        password = DigestUtils.md5DigestAsHex((password).getBytes());
        if (!password.equals(yddUser.getPassword())) {
            //密码错误
            throw new BaseException("密码错误");
        }

        //3、返回实体对象
        return yddUser;
    }

    @Autowired
    private ArticleMapper articleMapper;
    @Autowired
    private UserDataMapper userDataMapper;

    /**
     * 获取登录用户数据
     * @param id
     * @return
     */
    @Override
    public UserInfoVO getUserInfo(Integer id) {
        //查询登录用户信息
        YddUser yddUser = yddUserMapper.selectById(id);

        //获取用户发布文章总数
        QueryWrapper<Article> queryWrapper = new QueryWrapper<>();
        queryWrapper.ge("user_id", id.toString());
        Integer articleNum = articleMapper.selectCount(queryWrapper);

        //查询获取用户收藏记录总数
        QueryWrapper<UserData> queryWrapper2 = new QueryWrapper<>();
        queryWrapper.ge("user_id", id.toString()).ge("type", 1);
        Integer collectNum = userDataMapper.selectCount(queryWrapper2);

        //查询获取用户点赞记录总数
        QueryWrapper<UserData> queryWrapper3 = new QueryWrapper<>();
        queryWrapper.ge("user_id", id.toString()).ge("type", 2);
        Integer zanNum = userDataMapper.selectCount(queryWrapper2);

        //封装UserInfo返回
        return UserInfoVO.builder()
                .articleNum(articleNum)
                .collectNum(collectNum)
                .zanNum(zanNum)
                .userInfo(yddUser)
                .build();
    }
}
